#include "stdafx.h"
#include "XBSTR.h"


XBSTR::XBSTR()
{
    m_str = NULL;
}

XBSTR::XBSTR(_In_opt_ LPCOLESTR pSrc)
{
    m_str = NULL;
    SetBSTR((const BSTR)pSrc);
}

XBSTR::XBSTR(_In_ const XBSTR& src)
{
    m_str = NULL;
    SetBSTR(src.m_str);
}

XBSTR& XBSTR::operator=(_In_ const XBSTR& src)
{
    if(this != &src)
    {
        SetBSTR(src.m_str);
    }
    return (*this);
}

XBSTR& XBSTR::operator=(_In_opt_ LPCOLESTR pSrc)
{
    if (pSrc != m_str)
    {
        SetBSTR((const BSTR)pSrc);
    }
    return *this;
}

bool XBSTR::operator==(_In_opt_ LPCOLESTR pSrc)
{
    return (_tcscmp(pSrc, m_str) == 0);
}

XBSTR::~XBSTR()
{
    if(m_str != NULL)
    {
        ::SysFreeString(m_str);
        m_str = NULL;
    }
}

XBSTR::operator BSTR() const
{
    return m_str;
}

BSTR* XBSTR::operator&()
{
    return &m_str;
}

void XBSTR::SetBSTR(const BSTR bstr)
{
    if(bstr == m_str)
        return;

    ::SysFreeString(m_str);
    m_str = NULL;

    if(bstr != NULL)
        m_str = ::SysAllocString(bstr);
}
